

package vengadores;

import java.io.IOException;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 *Una clase de enemigo más poderoso, que es capaz de disparar muchas veces, hacer ataques especiales e incluso
 * burlarse del heroe
 * @author Felipe Donato Arrazola Gómez
 * @author Jorge de Jesús Tinoco Huesca
 * @author Arturo Ayala Tello
 */
public class Jefe extends Enemigo{

    //secuencias necesarias para el movimiento del jefe, el número tiene relación con el nivel al que pertene el jefe
    private int disparar_1[]={4,4,5,5,4,4,5,5,4,4,5,5};
    private int disparar_2[]={0,0,0,0,0,6,6,0,0,6,6,0,0,6,6,0,0};
    private int disparar_3[]={0,0,0,0,0,6,6,0,0,6,6,0,0,6,6,0,0};
    private int caminar_1[]={0,0,0,1,1,1,2,2,2,3,3,3};
    private int caminar_2[]={2,2,3,3,4,4,5,5};
    private int caminar_3[]={1,1,2,2,3,3,4,4,5,5};
    private int burla_1[]={13,13,14,14,13,13,14,14,13,13,14,14};
    private int burla_2[]={7,7,8,8,7,7,8,8,7,7,8,8,7,7,8,8,7,7,8,8};
    private int burla_3[]={7,7,8,8,9,9};
    private int especial_1[]={6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,10,10,10,10,10,10,11,11,12,12,11,11,12,12,11,11,12,12};
    private int especial_2[]={14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,16,16,16,15,15,15,16,16,16,15,15,15,16,16,16};
    private int especial_3[]={10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,12,12,12,13,13,13,14,14,14,13,13,13,14,14,14,13,13,13,14,14,14};
    private int golpeado_1[]={15,15,15,15};
    private int golpeado_2[]={9,9,9,9,9};
    private int golpeado_3[]={7,7};
    private int morir_1[]={15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18};
    private int morir_2[]={9,9,9,10,10,10,11,11,11,12,12,12,13,13,13};
    private int morir_3[]={15,15,15,16,16,16,17,17,17,18,18,18,19,19,19};
    private int nivel;//Nivel al que pertenece el jefe
    /**
     * Variable numérica que representa el último frame de la secuencia del ataque especial
     */
    public static int ULTESPECIAL;
    /**
     * Variable numérica que representa el último frame de la secuencia de burla
     */
    public static int ULTBURLA;
    /**
     * Variable que almacena si el jefe se está burlando o no
     */
    protected boolean estaBurlando;
    /**
     * Variable que almacena si el jefe está haciendo el ataque especial o no
     */
    protected boolean haciendoEspecial;
    /**
     * Variable que almacena si el jefe está atacando o no
     */
    protected boolean estaAtacando;
    /**
     * Variable numéria que almacena el último frame de la secuencia para correr
     */
    public static int ULTCORRIENDO;
    /**
     * Variable numérica que almacena el último frame de la secuencia de ataque
     */
    public static int FRAME_DANIO;
    /**
     * Variable numérica que almacena el último frame de la secuencia del ataque especial
     */
    public static int FRAME_DANIO_ESP;

    /**
     * Constructor de la clase que crea un jefe del nivel indicado
     * @param nivel es el nivel al cual pertenece el jefe
     * @throws IOException si las imágenes de los jefes no se encuentran en el archivo
     */
    public Jefe(int nivel) throws IOException {
        super(Enemigo.JEFE, nivel);
        this.nivel = nivel;
        switch(nivel){
            case 1:
                super.setImage(Image.createImage("/Jefe" + nivel + ".png"), 65, 62);
                ULTGOLPEADO=golpeado_1.length-1;
                ULTMUERTO=morir_1.length-1;
                ULTDISPARO=disparar_1.length-1;
                ULTBURLA=burla_1.length-1;
                ULTESPECIAL=especial_1.length-1;
                FRAME_DANIO = 5;
                FRAME_DANIO_ESP = 11;
                break;
            case 2:
                super.setImage(Image.createImage("/Jefe" +nivel+ ".png"), 89, 85); //89, 85
                ULTGOLPEADO=golpeado_2.length-1;
                ULTMUERTO=morir_2.length-1;
                ULTDISPARO=disparar_2.length-1;
                ULTBURLA = burla_2.length-1;
                ULTESPECIAL=especial_2.length-1;
                FRAME_DANIO = 6;
                FRAME_DANIO_ESP = 15;
                break;
            case 3:
                super.setImage(Image.createImage("/Jefe" + nivel + ".png"), 70,100);
                ULTGOLPEADO=golpeado_3.length-1;
                ULTMUERTO=morir_3.length-1;
                ULTDISPARO=disparar_3.length-1;
                ULTBURLA = burla_3.length-1;
                ULTESPECIAL = especial_3.length-1;
                FRAME_DANIO = 6;
                FRAME_DANIO_ESP = 13;
                break;
            default:
                break;

        }

    }

    /**
     * Método que regresa la acción que está realizando el jefe en el frame dado
     * @param frame es el frame del Sprite de jefe
     * @return el número que contiene el frame
     */

    public int getContenidoFrame(int frame){
        if(estaDisparando){
            switch(nivel){
                case 1:
                    return disparar_1[frame];
                case 2:
                    return disparar_2[frame];
                case 3:
                    return disparar_3[frame];
                default:
                    return -1;
            }
        }else if(haciendoEspecial){
            switch(nivel){
                case 1:
                    return especial_1[frame];
                case 2:
                    return especial_2[frame];
                case 3:
                    return especial_3[frame];
                default:
                    return -1;
            }
        }else{
            return -1;
        }

    }

    /**
     * Método que se encarga de hacer que el jefe dispare
     */

    public void disparar(){
        estaBurlando = false;
        estaCorriendo = false;
        estaMuriendo = false;
        haciendoEspecial = false;
        haSidoGolpeado = false;
        if(!estaDisparando){
            if(nivel == 1)
                setFrameSequence(disparar_1);
            else if(nivel ==2)
                setFrameSequence(disparar_2);
            else
                setFrameSequence(disparar_3);
            estaDisparando = true;
            estaAtacando = true;
        }

        if(this.getFrame()== ULTDISPARO){
            estaDisparando = false;
            estaAtacando = false;
        }
    }

    /**
     * Método que se encarga de que el jefe se burle del heroe
     */
    public void burlar(){
        estaDisparando = false;
        estaMuriendo = false;
        haciendoEspecial = false;
        haSidoGolpeado = false;
        estaCorriendo = false;
        if(!estaBurlando){
            if(nivel == 1)
                setFrameSequence(burla_1);
            else if(nivel ==2)
                setFrameSequence(burla_2);
            else
                setFrameSequence(burla_3);
            estaBurlando = true;
            estaAtacando = true;
        }

        if(this.getFrame()== ULTBURLA){
            estaBurlando = false;
            estaAtacando = false;
        }
    }

    /**
     * Método que se encarga de realizar el ataque especial del jefe
     */
    public void especial(){
        estaDisparando = false;
        estaMuriendo = false;
        haSidoGolpeado = false;
        estaCorriendo = false;
        estaBurlando = false;
        if(!haciendoEspecial){
            if(nivel == 1)
                setFrameSequence(especial_1);
            else if(nivel ==2)
                setFrameSequence(especial_2);
            else
                setFrameSequence(especial_3);
            haciendoEspecial = true;
            estaAtacando = true;
        }

        if(this.getFrame()== ULTESPECIAL){
            haciendoEspecial = false;
            estaAtacando = false;
        }
    }

    /**
     * Método que se encarga de mover al jefe y hacer que camine
     * @param direccion es la dirección en la cual se mueve, si tiene valor de verdadero, el jefe irá hacia
     * la derecha, si es falso, irá hacia la izquierda
     */
    public void caminar(boolean direccion){
        int x = getX();
        int y = getY();
        estaDisparando = false;
        estaBurlando = false;
        haciendoEspecial = false;
        haSidoGolpeado = false;
        estaAtacando = false;
        if (!estaCorriendo){
            if(nivel == 1)
                setFrameSequence(caminar_1);
            else if(nivel ==2)
                setFrameSequence(caminar_2);
            else
                setFrameSequence(caminar_3);
            estaCorriendo = true;
        }
        if(direccion){
            setTransform(Sprite.TRANS_NONE);
            setPosition(x,y);
            move(nivel+4,0);
        }else{
            setTransform(Sprite.TRANS_MIRROR);
            setPosition(x,y);
            move(-nivel-4,0);
        }
    }

    /**
     * Método que se encarga de animar al jefe para que muera
     */
    public void morir(){
        estaDisparando = false;
        estaBurlando = false;
        haciendoEspecial = false;
        haSidoGolpeado = false;
        estaCorriendo = false;
        estaAtacando = false;
        if(!estaMuriendo){
            if(nivel == 1)
                setFrameSequence(morir_1);
            else if(nivel ==2)
                setFrameSequence(morir_2);
            else
                setFrameSequence(morir_3);
            estaMuriendo = true;
        }

        if(this.getFrame()== ULTMUERTO){
            estaMuriendo = false;
        }
    }

    /**
     * Método que se encarga de poner al jefe en posición parada
     */
    public void parado() {
        estaDisparando = false;
        estaMuriendo = false;
        haciendoEspecial = false;
        haSidoGolpeado = false;
        estaCorriendo = false;
        estaAtacando = false;
        estaBurlando = false;
        super.setFrame(0);
    }

    /**
     * Método que se encarga de animar al jefe para que esté siendo golpeado
     */
    public void golpeado(){
        estaAtacando = false;
        estaDisparando = false;
        estaMuriendo = false;
        haciendoEspecial = false;
        estaCorriendo = false;
        estaBurlando = false;
        if(!haSidoGolpeado){
            if(nivel == 1)
                setFrameSequence(golpeado_1);
            else if(nivel ==2)
                setFrameSequence(golpeado_2);
            else
                setFrameSequence(golpeado_3);
            haSidoGolpeado = true;
        }

        if(this.getFrame()== ULTGOLPEADO){
            haSidoGolpeado = false;
        }
    }

}
